/*
 * WykonanieBadania.java
 *
 * Created on 2011-04-03, 11:39:31
 * Updated on 2011-05-03
 */
package medimg.widok.badania;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
import medimg.scheme.Badania;
import medimg.scheme.Pacjenci;
import medimg.scheme.Personel;
import medimg.scheme.RodzajBadan;
import org.hibernate.JDBCException;
import org.hibernate.Session;

/**
 *  Klasa dodająca badania wykonane na pacjentach
 *
 * @author PSI
 * @version 1.00
 */
public class WykonanieBadania extends javax.swing.JDialog {

    private DefaultComboBoxModel modelBadan;
    private DefaultComboBoxModel modelPacjentow;
    private DefaultComboBoxModel modelLekarzy;
    private RodzajBadan wyborBadania;
    private Pacjenci wyborPacjenta;
    private Personel wyborLekarza;

    /** Tworzy nowe okno WykonanieBadania */
    public WykonanieBadania(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
        this.setLocationRelativeTo(parent);
        modelBadan = new DefaultComboBoxModel();
        jComboBoxBadanie.setModel(modelBadan);
        modelPacjentow = new DefaultComboBoxModel();
        jComboBoxPacjent.setModel(modelPacjentow);
        modelLekarzy = new DefaultComboBoxModel();
        jComboBoxLekarz.setModel(modelLekarzy);
        pobierzDane();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jComboBoxPacjent = new javax.swing.JComboBox();
        jComboBoxLekarz = new javax.swing.JComboBox();
        jComboBoxBadanie = new javax.swing.JComboBox();
        jCheckBoxDataAktualna = new javax.swing.JCheckBox();
        jTextFieldData = new javax.swing.JTextField();
        jLabelPacjent = new javax.swing.JLabel();
        jLabelLekarz = new javax.swing.JLabel();
        jLabelBadanie = new javax.swing.JLabel();
        jLabelData = new javax.swing.JLabel();
        jButtonOk = new javax.swing.JButton();
        jButtonAnuluj = new javax.swing.JButton();
        jLabelWzorzecDaty = new javax.swing.JLabel();
        jLabelDiagnoza = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextAreaDiagnoza = new javax.swing.JTextArea();
        jTextFieldFiltr = new javax.swing.JTextField();
        jLabelFiltr = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
        setTitle("Wykonaj badanie");
        setModal(true);
        setName("WykonanieBadania"); // NOI18N
        setResizable(false);

        jComboBoxPacjent.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Wybierz pacjenta...", "Kowalski Jan <00000000>", "Nowak Zdzisław <11111111>", "Nowak Zdzisław <22222222>" }));

        jComboBoxLekarz.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Wybierz lekarza...", "Strzykający Stanisław", "Hujmnieboli Henryk", "Medyczny Maciej" }));

        jComboBoxBadanie.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Wybierz typ badania...", "Zdjęcie rentgenowskie", "Tomografia komputerowa", "Elektrokardiografia" }));

        jCheckBoxDataAktualna.setText("Dziś");
        jCheckBoxDataAktualna.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jCheckBoxDataAktualnaActionPerformed(evt);
            }
        });

        jLabelPacjent.setText("Pacjent");

        jLabelLekarz.setText("Lekarz wykonujący");

        jLabelBadanie.setText("Typ badania");

        jLabelData.setText("Data wykonania");

        jButtonOk.setText("OK");
        jButtonOk.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonOkActionPerformed(evt);
            }
        });

        jButtonAnuluj.setText("Anuluj");
        jButtonAnuluj.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButtonAnulujActionPerformed(evt);
            }
        });

        jLabelWzorzecDaty.setText("rrrr-mm-dd");

        jLabelDiagnoza.setText("Diagnoza");

        jTextAreaDiagnoza.setColumns(20);
        jTextAreaDiagnoza.setRows(5);
        jScrollPane1.setViewportView(jTextAreaDiagnoza);

        jTextFieldFiltr.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyReleased(java.awt.event.KeyEvent evt) {
                jTextFieldFiltrKeyReleased(evt);
            }
        });

        jLabelFiltr.setText("Filtr");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabelLekarz)
                        .addGap(18, 18, 18)
                        .addComponent(jComboBoxLekarz, 0, 210, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabelBadanie)
                        .addGap(50, 50, 50)
                        .addComponent(jComboBoxBadanie, 0, 210, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabelData)
                        .addGap(32, 32, 32)
                        .addComponent(jCheckBoxDataAktualna)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jTextFieldData, javax.swing.GroupLayout.PREFERRED_SIZE, 63, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jLabelWzorzecDaty))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabelDiagnoza)
                        .addGap(65, 65, 65)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 210, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabelFiltr)
                            .addComponent(jLabelPacjent))
                        .addGap(73, 73, 73)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addComponent(jComboBoxPacjent, 0, 210, Short.MAX_VALUE)
                            .addComponent(jTextFieldFiltr, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, 210, Short.MAX_VALUE)))
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addComponent(jButtonOk)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jButtonAnuluj)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextFieldFiltr, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabelFiltr))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jComboBoxPacjent, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabelPacjent))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jComboBoxLekarz, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabelLekarz))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabelBadanie)
                    .addComponent(jComboBoxBadanie, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextFieldData, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jCheckBoxDataAktualna)
                    .addComponent(jLabelWzorzecDaty)
                    .addComponent(jLabelData))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabelDiagnoza)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 109, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButtonAnuluj)
                    .addComponent(jButtonOk))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jCheckBoxDataAktualnaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jCheckBoxDataAktualnaActionPerformed
        if (jCheckBoxDataAktualna.isSelected()) {
            GregorianCalendar gc = new GregorianCalendar();
            java.sql.Date dzis = new java.sql.Date(gc.getTimeInMillis());
            jTextFieldData.setText(dzis.toString());
            jTextFieldData.setEnabled(false);
        } else {
            jTextFieldData.setText(null);
            jTextFieldData.setEnabled(true);
        }
    }//GEN-LAST:event_jCheckBoxDataAktualnaActionPerformed

    private void jButtonAnulujActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonAnulujActionPerformed
        this.dispose();
    }//GEN-LAST:event_jButtonAnulujActionPerformed

    private void jButtonOkActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButtonOkActionPerformed
        if (walidacjaDanych()) {
            Badania noweBadanie = new Badania();
            wybraneDane(wyborLekarza, wyborPacjenta, wyborBadania);
            noweBadanie.setRodzaj(wyborBadania.getId());
            noweBadanie.setPacjent(wyborPacjenta.getId());
            noweBadanie.setLekarz(wyborLekarza.getId());
            noweBadanie.setData(toSqlDate(jTextFieldData.getText()));
            noweBadanie.setDiagnoza(jTextAreaDiagnoza.getText());
            if (zatwierdzenieBadania(noweBadanie))
                JOptionPane.showConfirmDialog(this, "Wykonales badanie!", "Sukces", JOptionPane.DEFAULT_OPTION);
            else
                JOptionPane.showConfirmDialog(this, "Wykonanie badania sie nie powiodlo!", "Blad", JOptionPane.DEFAULT_OPTION);
            pobierzDane();
            jCheckBoxDataAktualna.setSelected(false);
            jTextFieldData.setText(null);
            jTextFieldFiltr.setText(null);
            jTextAreaDiagnoza.setText(null);
            jTextFieldData.setEnabled(true);
            jComboBoxPacjent.setModel(modelPacjentow);
        } else {
            JOptionPane.showConfirmDialog(this, "Wykonanie badania sie nie powiodlo!", "Blad", JOptionPane.DEFAULT_OPTION);
        }
    }//GEN-LAST:event_jButtonOkActionPerformed

    private void jTextFieldFiltrKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_jTextFieldFiltrKeyReleased
        filtrujPacjentow(jTextFieldFiltr.getText(), modelPacjentow);
    }//GEN-LAST:event_jTextFieldFiltrKeyReleased

    /**
     *  Metoda obsługująca filtr pacjentów, filtrowanie odbywa się po nazwisku pacjenta
     * @param filtr tekst podanego filtru
     * @param model model wyświetlania pacjentów w comboboxie
     */

    private void filtrujPacjentow(String filtr, DefaultComboBoxModel model) {
        if (filtr.length() == 0) { //jesli filtr pusty to przywroc stary model ktory zawiera wszystkie rekordy
            jComboBoxPacjent.setModel(model);
        } else {
            DefaultComboBoxModel newModel = new DefaultComboBoxModel();
            newModel.addElement("Wybierz pacjenta...");
            for (int i = 0; i < model.getSize(); i++) {
                //jesli znaleziony filtr jest na poczatku napisu to dodaj do nowego modelu
                if (model.getElementAt(i).toString().indexOf(filtr) == 0) {
                    newModel.addElement(model.getElementAt(i));
                }
            }
            if (newModel.getSize() == 1) {
                newModel.removeAllElements();
                newModel.addElement("Brak pacjentow!");
            }
            jComboBoxPacjent.setModel(newModel);
        }
    }

    /**
     * Metoda przekształcająca datę podaną w postaci tekstu do typu bazodanowego
     * @param strDate tekst daty
     * @return datę w formacie sql Date
     */
    private java.sql.Date toSqlDate(String strDate) {
        DateFormat dateFrm = new SimpleDateFormat("yyyy-MM-dd");
        java.util.Date myDate = new java.util.Date();
        java.sql.Date sqlDate;

        try {
            myDate = dateFrm.parse(strDate);
            sqlDate = new java.sql.Date(myDate.getTime());
        } catch (Exception e) {
            sqlDate = null;
        }

        return (sqlDate);
    }

    /**
     * Metoda pobiera z bazy dane - pacjentów, lekarzy oraz typy badań aby umieścić je w odpowiednich comboboxach
     */
    private void pobierzDane() {
        if (!medimg.hibernate.HibernateUtil.isOpen()) {
            JOptionPane.showConfirmDialog(this, "Najpierw podłącz się do bazy.", "Nie polaczono", JOptionPane.DEFAULT_OPTION);
            return;
        }
        modelBadan.removeAllElements();
        modelPacjentow.removeAllElements();
        modelLekarzy.removeAllElements();
        ArrayList<RodzajBadan> listaBadan = null;
        ArrayList<Pacjenci> listaPacjentow = null;
        ArrayList<Personel> listaLekarzy = null;
        Session session = medimg.hibernate.HibernateUtil.getSessionFactory().getCurrentSession(); //pobranie obecnej sesji (autostart jesli jej nie ma)
        try {
            session.beginTransaction(); //rozpoczecie transakcji
            listaBadan = new ArrayList<RodzajBadan>(session.createQuery("from RodzajBadan").list());
            listaPacjentow = new ArrayList<Pacjenci>(session.createQuery("from Pacjenci").list());
            listaLekarzy = new ArrayList<Personel>(session.createQuery("from Personel").list());
            session.getTransaction().commit();
        } catch (JDBCException ex) {
            session.getTransaction().rollback(); //jesli sie nie udalo to rollback zeby dane byly zgodne
        }

        if (listaBadan != null && !listaBadan.isEmpty()) {
            modelBadan.addElement("Wybierz typ badania...");
            for (RodzajBadan rodzBad : listaBadan) {
                modelBadan.addElement(rodzBad.getNazwa());
            }
        } else {
            modelBadan.addElement("Brak definicji typów badań!");
        }

        if (listaPacjentow != null && !listaPacjentow.isEmpty()) {
            modelPacjentow.addElement("Wybierz pacjenta...");
            for (Pacjenci pac : listaPacjentow) {
                modelPacjentow.addElement(pac.getNazwisko() + " " + pac.getImie());
            }
        } else {
            modelPacjentow.addElement("Brak pacjentow!");
        }

        if (listaLekarzy != null && !listaLekarzy.isEmpty()) {
            modelLekarzy.addElement("Wybierz lekarza...");
            for (Personel per : listaLekarzy) {
                modelLekarzy.addElement(per.getNazwisko() + " " + per.getImie());
            }
        } else {
            modelLekarzy.addElement("Brak lekarzy!");
        }
    }

    /**
     * Metoda odczytuje wybrane przez użytkownika dane - pacjenta, lekarza oraz typ badań
     * @param lekarz obiekt reprezentujący lekarzy
     * @param pacjent obiekt reprezentujący pacjentów
     * @param rodzaj obiekt reprezentujący rodzaj badań
     */

    private void wybraneDane(Personel lekarz, Pacjenci pacjent, RodzajBadan rodzaj) {
        if (!medimg.hibernate.HibernateUtil.isOpen()) {
            JOptionPane.showConfirmDialog(this, "Najpierw podłącz się do bazy.", "Nie polaczono", JOptionPane.DEFAULT_OPTION);
            return;
        }
        Session session = medimg.hibernate.HibernateUtil.getSessionFactory().getCurrentSession(); //pobranie obecnej sesji (autostart jesli jej nie ma)
        rodzaj = null;
        pacjent = null;
        lekarz = null;
        int indeks;
        indeks = jComboBoxPacjent.getSelectedItem().toString().indexOf(" ");
        String nazwiskoPacjenta = jComboBoxPacjent.getSelectedItem().toString().substring(0, indeks);
        String imiePacjenta = jComboBoxPacjent.getSelectedItem().toString().substring(indeks + 1, jComboBoxPacjent.getSelectedItem().toString().length());
        indeks = jComboBoxLekarz.getSelectedItem().toString().indexOf(" ");
        String nazwiskoLekarza = jComboBoxLekarz.getSelectedItem().toString().substring(0, indeks);
        String imieLekarza = jComboBoxLekarz.getSelectedItem().toString().substring(indeks + 1, jComboBoxLekarz.getSelectedItem().toString().length());

        try {
            session.beginTransaction(); //rozpoczecie transakcji
            rodzaj = (RodzajBadan) (session.createQuery("from RodzajBadan where Nazwa = '" + jComboBoxBadanie.getSelectedItem().toString() + "'").uniqueResult());
            pacjent = (Pacjenci) (session.createQuery("from Pacjenci where Nazwisko = '" + nazwiskoPacjenta + "' and Imie = '" + imiePacjenta + "'").uniqueResult());
            lekarz = (Personel) (session.createQuery("from Personel where Nazwisko = '" + nazwiskoLekarza + "' and Imie = '" + imieLekarza + "'").uniqueResult());
            session.getTransaction().commit();
        } catch (JDBCException ex) {
            session.getTransaction().rollback(); //jesli sie nie udalo to rollback zeby dane byly zgodne
        }

        wyborBadania = rodzaj;
        wyborPacjenta = pacjent;
        wyborLekarza = lekarz;
    }

    /**
     * Metoda umieszczająca zdefiniowane badanie przez użytkownika w bazie danych
     * @param badanie obiekt reprezentujący dane badanie
     */

    private boolean zatwierdzenieBadania(Badania badanie) {
        Session session = medimg.hibernate.HibernateUtil.getSessionFactory().getCurrentSession(); //pobranie obecnej sesji (autostart jesli jej nie ma)
        try {
            session.beginTransaction(); //rozpoczecie transakcji
            session.save(badanie);
            session.getTransaction().commit();
            return true;
        } catch (JDBCException ex) {
            session.getTransaction().rollback(); //jesli sie nie udalo to rollback zeby dane byly zgodne
            return false;
        }
    }

    /**
     * Metoda sprawdzająca czy użytkownik dokonał wyboru we wszystkich wymagających polach
     * @return czy walidacja przeszła poprawnie
     */
    private boolean walidacjaDanych() {
        if (jComboBoxBadanie.getSelectedItem().equals("Wybierz typ badania...")) {
            JOptionPane.showConfirmDialog(this, "Nie wybrano rodzaju badania!", "Blad", JOptionPane.DEFAULT_OPTION);
            return false;
        } else if (jComboBoxPacjent.getSelectedItem().equals("Wybierz pacjenta...") || jComboBoxPacjent.getSelectedItem().equals("Brak pacjentow!")) {
            JOptionPane.showConfirmDialog(this, "Nie wybrano pacjenta!", "Blad", JOptionPane.DEFAULT_OPTION);
            return false;
        } else if (jComboBoxLekarz.getSelectedItem().equals("Wybierz lekarza...")) {
            JOptionPane.showConfirmDialog(this, "Nie wybrano lekarza!", "Blad", JOptionPane.DEFAULT_OPTION);
            return false;
        } else if (toSqlDate(jTextFieldData.getText()) == null) {
            JOptionPane.showConfirmDialog(this, "Okresl date!.", "Blad", JOptionPane.DEFAULT_OPTION);
            return false;
        }
        return true;
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                WykonanieBadania dialog = new WykonanieBadania(new javax.swing.JFrame(), true);
                dialog.addWindowListener(new java.awt.event.WindowAdapter() {

                    public void windowClosing(java.awt.event.WindowEvent e) {
                        System.exit(0);
                    }
                });
                dialog.setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButtonAnuluj;
    private javax.swing.JButton jButtonOk;
    private javax.swing.JCheckBox jCheckBoxDataAktualna;
    private javax.swing.JComboBox jComboBoxBadanie;
    private javax.swing.JComboBox jComboBoxLekarz;
    private javax.swing.JComboBox jComboBoxPacjent;
    private javax.swing.JLabel jLabelBadanie;
    private javax.swing.JLabel jLabelData;
    private javax.swing.JLabel jLabelDiagnoza;
    private javax.swing.JLabel jLabelFiltr;
    private javax.swing.JLabel jLabelLekarz;
    private javax.swing.JLabel jLabelPacjent;
    private javax.swing.JLabel jLabelWzorzecDaty;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea jTextAreaDiagnoza;
    private javax.swing.JTextField jTextFieldData;
    private javax.swing.JTextField jTextFieldFiltr;
    // End of variables declaration//GEN-END:variables
}
